package com.summer.controller;

import com.summer.common.R;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
import org.springframework.web.multipart.MultipartFile;

import javax.servlet.ServletOutputStream;
import javax.servlet.http.HttpServletResponse;
import java.io.*;
import java.util.UUID;

@RestController
@RequestMapping("/common")
@Slf4j
public class CommonController {

    @Value("${reggie.uploadImageSavePosition}")
    private String savePosition;

    /**
     * 保存上传的文件
     * @param file 获取上传的文件
     * @return 返回保存在服务器的图片文件名，用于前端回显图片
     */
    @PostMapping("/upload")
    public R<String> fileUpload(MultipartFile file){
        // 1. 获取上传的文件信息
        String originalFilename = file.getOriginalFilename();
        log.info("上传文件请求, 请求上传的文件名为：{}", originalFilename);

        // 2. 转存到服务端磁盘
        // 若目录不存在则创建
        File saveCatalog = new File(savePosition);
        if(!saveCatalog.exists()){
            log.info("已创建目录：{}", savePosition);
            saveCatalog.mkdirs();
        }

        // 处理保存路径名
        String prefix = UUID.randomUUID().toString(); // TODO uuid工具类
        String suffix = originalFilename.substring(originalFilename.lastIndexOf("."));
        String saveFileName = savePosition  + prefix + suffix;
        // 转存
        try {
            file.transferTo(new File(saveFileName));
            log.info("已保存图片，位置：{}", saveFileName);
        } catch (IOException e) {
            e.printStackTrace();
        }
        // 3. 返回图片保存路径
        return R.success(prefix + suffix);
    }

    /**
     * 向前端回写图片用于展示
     * @param response 用于回写字节输出流（图片）
     * @param name 接收服务端的图片文件绝对路径
     */
    @GetMapping("/download")
    public void fileDownLoad(HttpServletResponse response, String name){
        log.info("文件下载请求，请求文件名为: {}", name);
        try {
            // 1. 根据name创建字节输入流输入图片数据
            BufferedInputStream inputStream = new BufferedInputStream(new FileInputStream(savePosition + name));
            // 2. 用response通过字节输出流将图片输出到前端
            ServletOutputStream outputStream = response.getOutputStream();
            // 设置响应类型
            response.setContentType("image/jpeg");

            int len = 0;
            byte[] bytes = new byte[1024];
            while ( (len = inputStream.read(bytes)) != -1){
                outputStream.write(bytes, 0, len);
                outputStream.flush();
            }

            // 3. 释放资源
            inputStream.close();
            outputStream.close();
        } catch (IOException e) {
            e.printStackTrace();
        }


    }
}
